home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / lollipop / lists.tex < prev    next >
Text File  |  1993-01-28  |  11KB  |  341 lines

  1. % Lists.tex copyright 1992/3 Victor Eijkhout
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. %%%%%%%%%%%%%%% L I S T S 
  4.  
  5.  
  6. \@GenericConstruct{List}
  7.  
  8. \newif\if@initem \@initemyes \newif\if@alitem
  9. \newbox\@labelbox 
  10.  
  11. \def\item{\Emessage{Item command outside list}}
  12.  
  13. % Breakpoints around a list
  14. %
  15. % first redefine generic defaults:
  16. % try not to break before, maybe not after,
  17. %
  18. \add@List@default{\def\@beforepenalty{\penalty1000 }}
  19. \add@List@default{\def\@afterpenalty{\penalty200 }}
  20.  
  21. % between items is okay
  22. \add@List@default{\def\@betweenpenalty{\penalty-50 }}
  23. \@ListOption{breakbetween}{
  24.     \switch {\if\EqualString{#1}}
  25.     {no}  {\def\@betweenpenalty{\penalty\@M}}
  26.     {yes} {\def\@betweenpenalty{\CSname{\h@or@v fil}\penalty-\@M}}
  27.     {0}   {\def\@betweenpenalty{}}
  28.     {default} {\edef\cs@e{\def\nxp\@betweenpenalty{\penalty\@w@w{#1}\relax}}
  29.                \cs@e}
  30.     \endswitch
  31.     }
  32.  
  33. \newtoks\indent@depth
  34. \add@List@default{\indent@depth={}}
  35.  
  36. \noeol
  37. \def\@DefineList{
  38.     \@DefineStopCommand{\nxp\xx@label \the\item@e@coms\@gen@close}
  39.     \csarg\edef{\@name}{\@gen@open
  40.          \ifitem@list \nxp\step@counter{itemlevel}\fi
  41.          \ifenum@list \nxp\step@counter{enumlevel}
  42.             \nxp\represent@counter{item}
  43.                 {\nxp\enum@repr{\counter@@name{enumlevel}}}\fi
  44.          \ifleft@embedded@construct \previousindent\z@
  45.              \else \nxp\PushIndentLevel 
  46.                    \ifauto@indent \else \levelindent\the\indent@depth \fi
  47.                    \parindent\levelindent
  48.              \fi
  49.          \nxp\@alitemno
  50.          \nxp\start@counter{item}%
  51.          \the\item@b@coms
  52.          \def\nxp\item@label{
  53.              \nxp\ifdim\wd\@labelbox>\tempdima
  54.                  \ifitem@tab \advance\tempdima20pt\relax
  55.                              {\nxp\item@label}
  56.                  \else \iflabel@flow@right 
  57.                              \ifleft@embedded@construct
  58.                              \else\hskip-\previousindent\fi
  59.                              \box\@labelbox
  60.                        \else \nxp\llap{\box\@labelbox}\fi\fi
  61.              \nxp\else \llap{\hbox to \tempdima
  62.                 {\ifleft@item\else\hfil\fi
  63.                  \box\@labelbox \ifleft@item\hfil\fi}}
  64.              \nxp\fi}%
  65.          \def\nxp\num@item
  66.             {\setbox\@labelbox=\hbox{\the\item@coms}
  67.              \tempdima\previousindent
  68.              \nxp\item@label %\nxp\Indent:no
  69.              \the\item@a@coms \nxp\xx@label}
  70.          \def\nxp\item
  71.             {\ifleft@embedded@construct
  72.              \else \nxp\if@alitem\@par%\CSname{@itembreek}%
  73.                    \nxp\hold@parskip \nxp\fi \fi
  74.              \nxp\if\nxp\TestCounter:item >0 \@betweenpenalty \nxp\fi
  75.              \CSname{@\h@or@v white}{\white@between}
  76.              \nxp\@initemno \nxp\@alitemyes \nxp\noindent
  77.              \nxp\step@counter{item}\relax 
  78.              \iflabel@defined\else\nxp\define@reference{item}\fi
  79.              \CSname{\@name @item}}
  80.          }
  81.     \csarg\edef{\@name @item}{
  82.          \iflist@has@description \nxp\desc@item
  83.          \else \nxp\num@item\fi}
  84.     \@Labelize{\@name @item}
  85.     }
  86. \normaleol
  87.  
  88. % Inside a list Foo \item is defined as
  89. %
  90. % \item = all sorts of skips and switches
  91. %         step item counter, define reference
  92. %         \Foo@item
  93. %
  94. % \Foo@item[opt.lab.] = \desc@item or \num@item
  95. %
  96. % \desc@item =
  97. % { \aftergroup\num@item \@description}
  98. %
  99. % \num@item = \item@label \item@a@coms \xx@label
  100. %
  101.  
  102. % Item
  103. % start with start/left/right
  104. % indicating alignment, start = left
  105. %
  106. \newif\ifleft@item \newif\ifitem@tab
  107. \add@List@default{\left@itemyes \item@tabno}
  108. \newtoks\item@coms % content of the item label
  109. \newtoks\item@b@coms % start of the list?
  110. \newtoks\item@a@coms % immediately after the item
  111. \newtoks\item@e@coms % after the whole list
  112. \add@List@default{\item@coms{}\item@b@coms{}\item@a@coms{}
  113.     \item@e@coms{}\def\@current@options@list{item@b@coms}}
  114. \@ListOption{item}{
  115.     \switch {\if\EqualString{#1}}
  116.     {stop} {\@add@toks{\egroup}\e@group
  117.          \def\@current@options@list{item@a@coms}}
  118.     {tabstop} {\item@tabyes
  119.              \@add@toks{\egroup}\e@group
  120.              \def\@current@options@list{item@a@coms}}
  121.     {left} {\global\left@itemyes
  122.              \b@group\def\@current@options@list{item@coms}%
  123.              \@add@toks{\bgroup}}
  124.     {start}{\global\left@itemyes
  125.              \b@group\def\@current@options@list{item@coms}%
  126.              \@add@toks{\bgroup}}
  127.     {right}{\global\left@itemno
  128.              \b@group\def\@current@options@list{item@coms}%
  129.              \@add@toks{\bgroup}}
  130.     {default} {\Emessage{Unknown option #1 for List, item}}
  131.     \endswitch}
  132.  
  133. % Label overflow
  134. %
  135. \newif\iflabel@flow@right
  136. \add@List@default{\label@flow@rightyes}
  137. \@ListOption{labeloverflow}{
  138.     \if\EqualString{#1}{left}\label@flow@rightno
  139.     \else\label@flow@rightyes\fi}
  140.  
  141. % Description
  142. % the line after \item gets picked up,
  143. % and becomes available as `description'
  144. %
  145. \newif\iflist@has@description
  146. \add@List@default{\list@has@descriptionno}
  147. \@ListOption{description}{
  148.     \global\list@has@descriptionyes \@add@toks{\description@text}}
  149. {\noeol
  150.  \othercr
  151. \gdef\@description{\bgroup\othercr \@@description}
  152. \gdef\@@description#1^^M
  153.     {\gdef\description@text{#1}%
  154.     \egroup % balance the \bgroup in \@description
  155.             % which kept the \othercr local
  156.     \egroup % balance the \bgroup in \desc@item
  157.             % which enabled the \aftergroup\num@item
  158.     }
  159. }
  160. \def\desc@item{\bgroup    
  161.     \aftergroup\num@item
  162.     \@description}
  163.  
  164. % White between items
  165. %
  166. \add@List@default{\def\white@between{0pt}}
  167. \@ListOption{whitebetween}{\def\white@between{#1}}
  168. %    \edef\white@between{\@w@w{#1}}}
  169.  
  170. % Indentation
  171. % is automatic (default) and level dependent
  172. % or explicit
  173. %
  174. \newif\ifauto@indent
  175. \add@List@default{\auto@indentyes}
  176. \@ListOption{indentation}{
  177.     \if\EqualString{#1}{automatic}\auto@indentyes
  178.     \else\auto@indentno
  179.          \edef\cs@e{\nxp\indent@depth={\@w@w{#1}}}\cs@e
  180.     \fi}
  181.  
  182. % Tail of the list:
  183. % everything after the keyword 'text' is tail
  184. %
  185. \@ListOption{text}{\at@breakpointyes
  186.     \def\@current@options@list{item@e@coms}}
  187.  
  188. %%%%%%%%%%%%%%%% List Nesting Counters
  189. %
  190.  
  191. % Item sign
  192. % gives the default, level dependent marker
  193. %
  194. \new@@counter{itemlevel} \set@counter{itemlevel}0
  195. \newif\ifitem@list
  196. \add@List@default{\item@listno}
  197. \@ListOption{itemsign}{
  198.     \global\item@listyes
  199.     \edef\cs@e{\nxp\@add@toks
  200.                 {\nxp\ifcustom@label\nxp\the\current@label
  201.                  \nxp\else\nxp\item@sign\counter@@name{itemlevel}%
  202.                  \nxp\fi}}
  203.     \cs@e}
  204. \def\@item@sign#1{itemsign\romannumeral#1}
  205. \def\item@sign#1{\ifnotdefined{\@item@sign{#1}}\@@item@sign{#1}%
  206.     \else \csname \@item@sign{#1}\endcsname \fi}
  207. \def\@@item@sign#1{\ifcase#1\relax\or
  208.     $\bullet$\or $\circ$ \or --\else $\cdot$\fi}
  209. \def\SetItemSign:#1=#2{\csarg\edef{\@item@sign{#1}}%
  210.    {\cswitch \ifx#2 in:
  211.     b $\bullet$;
  212.     c $\circ$;
  213.     d $\diamond$;
  214.     m ---;
  215.     n --;
  216.     . $\cdot$;
  217.     default $\cdot$;
  218.     \endswitch}}
  219.  
  220. % Item Counter 
  221. % Allocate a bare bones counter
  222. \new@@counter{item}\represent@counter{item}1
  223. \newtoks\item@RL \item@RL{}
  224.  
  225. % Keep track of enumerate list level
  226. %
  227. \new@@counter{enumlevel} \set@counter{enumlevel}0
  228. \newif\ifenum@list
  229. \add@List@default{\enum@listno}
  230. \@ListOption{itemCounter}{
  231.     \global\enum@listyes
  232.     \@add@toks{\pad@clear\ifcustom@label\the\current@label
  233.                \else\itemCounter\fi}
  234.     }
  235. \def\@enum@repr#1{enumrepr\romannumeral#1}
  236. \def\enum@repr#1{\ifnotdefined{\@enum@repr{#1}}\@@enum@repr{#1}%
  237.     \else \csname \@enum@repr{#1}\endcsname \fi}
  238. \def\@@enum@repr#1{\ifcase#1\relax\or
  239.     1\or A\or I\or a\or i\else 1\fi}
  240. \def\SetItemCounterRepresentation:#1=#2{\csarg\edef{\@enum@repr{#1}}{#2}}
  241.  
  242. %
  243. \def\@itembreek{\if@initem\par\fi}
  244.  
  245. % Clear items for Widest.
  246. % this is rather susceptible for improvement.
  247. %
  248. \def\ClearFor:#1 
  249.    {\def\widest@pad{#1}}
  250. \def\widest@pad{\m@ne}
  251. \def\pad@clear{\ifnum\widest@pad=\m@ne\else
  252.     \tempcounta\widest@pad
  253.     \advance\tempcounta-\LogTen{\cs@counter@name{item}}\relax
  254.     \hphantom{\ifcase\tempcounta \or 9\or 99 \or 999 \or 9999 \else 99999\fi
  255.               }%
  256.     \fi}
  257.  
  258. %%%%%%%%%%%%%%%% Stripped Lists
  259. %
  260. % for use in external files
  261. %
  262.  
  263. \@GenericConstruct{ExternalItem}%stripped list
  264.  
  265. \add@ExternalItem@default{\extra@args\tw@}
  266.  
  267. \noeol
  268. \def\@DefineExternalItem{
  269.     \@DefineStopCommand{\@gen@close}
  270.     \ifx\pre@fix\@empty \Wmessage{No file for external item: \@name}\fi
  271.     \edef\cs@e{\nxp\append@to@list
  272.          {\pre@fix @local@defs}
  273.          {\nxp\ifnotdefined{\@command}
  274.                    \nxp\Wmessage{Item `\@name' not defined for `\pre@fix'}
  275.           \nxp\else\let\CSname{\@name}\CSname{\@command}
  276.           \nxp\fi}}
  277.     \cs@e
  278.     \csarg\edef{\@command}##1##2{
  279.          \def\CSname{\@name Label}{##1}
  280.          \@gen@open\def\nxp\Page{##2}
  281.          \nxp\PushIndentLevel \let\nxp\nl\relax
  282.          \the\item@b@coms
  283.          \def\nxp\item{\ifleft@embedded@construct\else\noindent\fi
  284.              \setbox\@labelbox=\hbox{\the\item@coms}
  285.              \nxp\ifdim\wd\@labelbox>\previousindent
  286.                  \iflabel@flow@right \hskip-\previousindent\box\@labelbox
  287.                  \else \nxp\llap{\box\@labelbox}\fi
  288.              \nxp\else \llap{\hbox to \previousindent
  289.                 {\ifleft@item\else\hfil\fi
  290.                  \box\@labelbox \ifleft@item\hfil\fi}}
  291.              \nxp\fi}%
  292.          \ifexternal@item@has@item\nxp\item\the\item@a@coms\fi
  293.          \ifright@embedded@construct\else\@par\fi
  294.          \iflong@external\else\nxp\>\fi
  295.          }
  296.     }
  297. \normaleol
  298.  
  299. \add@ExternalItem@default{\@whitebefore\z@toks}
  300. \add@ExternalItem@default{\@whiteafter\z@toks}
  301. \add@ExternalItem@default{\let\Page\@space 
  302.     \csarg\let{\@name Label}\@space}
  303.  
  304. % Specify for what external file this is meant
  305. %
  306. \@ExternalItemOption{file}{\def\pre@fix{#1}}
  307.  
  308. \newif\iflong@external
  309. \add@ExternalItem@default{\long@externalno}
  310. \@ExternalItemOption{long}{
  311.     \csname long@external#1\endcsname}
  312.  
  313. % Commands before and after
  314. % option 'title' is dummy
  315. %
  316. %\@ExternalItemOption{title}{}
  317. % dangerous: better rely on automatic titelization
  318.  
  319. % Item
  320. % start with start/left/right
  321. % indicating alignment, start = left
  322. %
  323. \add@ExternalItem@default{\left@itemyes}
  324. \add@ExternalItem@default{\item@coms{}\item@b@coms{}\item@e@coms{}
  325.     \item@a@coms{}\def\@current@options@list{item@b@coms}}
  326. \newif\ifexternal@item@has@item
  327. \adds@ExternalItem@default{\external@item@has@itemno}
  328. \def\ExternalItem@item{\external@item@has@itemyes
  329.   \List@item}
  330.  
  331. % Label overflow
  332. %
  333. \add@ExternalItem@default{\label@flow@rightyes}
  334. \let\ExternalItem@labeloverflow\List@labeloverflow
  335.  
  336. \endinput
  337.  
  338. 92/11/26 itemsign / itemCounter changed to handle custom@label
  339. 93/01/03 item call in ExternalItem made conditional